home *** CD-ROM | disk | FTP | other *** search
/ 9-Digit Zip Code Directory / 9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO / z4src.zip / DICOPY.C < prev    next >
C/C++ Source or Header  |  1993-06-15  |  4KB  |  151 lines

  1. //----------------------------------------------------------------------------
  2. //                            MODULE DESCRIPTION
  3. //
  4. //  Module:    dicopy.c
  5. //   Title:    Data File I/O Library
  6. //  Notice:    John M. Weeder
  7. //                 Copyright (c) 1993. All rights reserved.
  8. //             This module contains proprietary information and should be 
  9. //                treated as confidential.
  10. //
  11. //----------------------------------------------------------------------------
  12. //                           MAINTENANCE HISTORY
  13. //
  14. // $Workfile$
  15. // $Revision$
  16. //   $Author$
  17. //     $Date$
  18. //      $Log$    
  19. //
  20. //----------------------------------------------------------------------------
  21. //                             MODULE NARRATIVE
  22. //
  23. //
  24. //    This module contains code to update a logical file within a physical file.
  25. //
  26. //    The code in this module should be written entirely in C. 
  27. //    Do not use any C++ constructs.
  28. //
  29. //    This module is portable to:
  30. //        DOS 3.X+
  31. //        MS Windows 3.X+
  32. //        OS/2 2.X+
  33. //        OS/2 2.0 PM
  34. //        SCO UNIX.
  35. //
  36. //    The following compilers are supported:
  37. //        MSC 6.0A
  38. //        MSC/C++ 7.0
  39. //        Borland C++ 3.1 for DOS
  40. //        Borland C++ 1.0 for OS/2 2.X
  41. //        SCO UNIX cc
  42. //
  43. //----------------------------------------------------------------------------
  44. #include <di.h>
  45.  
  46.  
  47. //----------------------------------------------------------------------------
  48. //   Description:    Update the data area of a logical file.
  49. //    Parameters:    pcszP1        Physical file name to copy to.
  50. //                        pcszL1        Logical file to copy to
  51. //                        pcszP2        Physical file name to copy to.
  52. //                        pcszL2        Logical file to copy from
  53. //                        usType        Logical file type
  54. //       Returns:    TRUE if successful.
  55. //----------------------------------------------------------------------------
  56. BOOL FN_E DioCopy(PCSZ pcszP1, PCSZ pcszL1, PCSZ pcszP2, PCSZ pcszL2, USHORT usType)
  57. {
  58.     HPF hpf2 = -1, hpf1 = -1;
  59.     HLF hlf2 = -1, hlf1 = -1;
  60.     HF hf1, hf2;
  61.     BOOL fUser2, fUser1;
  62.     FPOS flen2;
  63.     BOOL fResult = FALSE;
  64.     BYTE bUser[MAX_DATA_USER];
  65.     FLAG32 fl;
  66.     USHORT usVersion;
  67.  
  68.     if (HIUSHORT(pcszP2))
  69.         {
  70.         if (!DioOpenPhysical(pcszP2, &hpf2, TRUE))
  71.             goto ERROR_EXIT;
  72.  
  73.         fUser2 = FALSE;
  74.         }
  75.     else
  76.         {
  77.         hpf2 = LOUSHORT(pcszP2);
  78.         Assert(hpf2 >= 0 && hpf2 < MAX_PHYSICAL_FILES);
  79.         Assert(di.physical[hpf2].fUsed);
  80.         fUser2 = TRUE;
  81.         }
  82.                                                     // Not open logical file
  83.     if (!DioOpenLogical(pcszL2, &hlf2, usType))
  84.         goto ERROR_EXIT;
  85.  
  86.     hf2 = di.logical[hlf2].hf;
  87.     flen2 = di.logical[hlf2].flen;
  88.     if ((flen2 % (FPOS)sizeof(DATAHDR)) != 0)
  89.         {
  90.         flen2 += sizeof(DATAHDR);            // Round up to nearest multiple of
  91.         flen2 /= sizeof(DATAHDR);            //  header size
  92.         flen2 *= sizeof(DATAHDR);
  93.         }
  94.     if (!DioAppend(pcszP1, pcszL1, usType, di.logical[hlf2].usBlockSize, &hf1, NULL))
  95.         {
  96.         DioAppendClose(fResult, FALSE);
  97.         goto ERROR_EXIT;
  98.         }
  99.     if (!FileCopy(hf1, -1, hf2, di.logical[hlf2].fbase, flen2))
  100.         {
  101.         DioAppendClose(fResult, FALSE);
  102.         goto ERROR_EXIT;
  103.         }
  104.     if (!DioAppendClose(TRUE, TRUE))
  105.         goto ERROR_EXIT;
  106.     if (HIUSHORT(pcszP1))
  107.         {
  108.         if (!DioOpenPhysical(pcszP1, &hpf1, TRUE))
  109.             goto ERROR_EXIT;
  110.  
  111.         fUser1 = FALSE;
  112.         }
  113.     else
  114.         {
  115.         hpf1 = LOUSHORT(pcszP1);
  116.         Assert(hpf1 >= 0 && hpf1 < MAX_PHYSICAL_FILES);
  117.         Assert(di.physical[hpf1].fUsed);
  118.         fUser1 = TRUE;
  119.         }
  120.     if (!DioOpenLogical(pcszL1, &hlf1, usType))
  121.         goto ERROR_EXIT;
  122.     if (!DioGetUser(hlf2, bUser, sizeof(bUser)))
  123.         goto ERROR_EXIT;
  124.     if (!DioSetUser(hlf1, bUser, sizeof(bUser)))
  125.         goto ERROR_EXIT;
  126.     if (!DioGetFlags(hlf2, &fl))
  127.         goto ERROR_EXIT;
  128.     if (!DioSetFlags(hlf1, fl))
  129.         goto ERROR_EXIT;
  130.     if (!DioGetVersion(hlf2, &usVersion))
  131.         goto ERROR_EXIT;
  132.     if (!DioSetVersion(hlf1, usVersion))
  133.         goto ERROR_EXIT;
  134.  
  135.     fResult = TRUE;
  136.  
  137. ERROR_EXIT:
  138.     if (hlf1 >= 0)
  139.         DioCloseLogical(hlf1);
  140.     if (!fUser1 && hpf1 >= 0)
  141.         DioClosePhysical(hpf1);
  142.     if (hlf2 >= 0)
  143.         DioCloseLogical(hlf2);
  144.     if (!fUser2 && hpf2 >= 0)
  145.         DioClosePhysical(hpf2);
  146.     return fResult;
  147. }
  148. //----------------------------------------------------------------------------
  149. //------------------------------- End of File --------------------------------
  150. //----------------------------------------------------------------------------
  151.